package es.masterd.lector_rss.activities;

import es.masterd.lector_rss.R;
import es.masterd.lector_rss.db.FeedsDB.Posts;
import es.masterd.lector_rss.rssparser.RssDownloadHelper;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import android.widget.SimpleCursorAdapter.ViewBinder;
import android.widget.TextView;

public class TitularesActivity extends ListActivity {
    
	/**
	 * Definición de constantes necesarias para la clase
	 */
	private static final String FEED_URL="http://www.masterd.es/blog/feed/";
	private static final long FRECUENCIA_ACTUALIZACION = 60 * 60 * 1000; // recarga cada hora
	private static final int DIALOG_ABOUT = 0;
	
	private ActualizarPostAsyncTask tarea;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_PROGRESS);
        setContentView(R.layout.feeds);
        
        setTitle(R.string.titulo_noticias);
        configurarAdapter();
    }
    
   	@Override
    public void onResume() {
    	super.onResume();
    	cargarNoticias();
    }
   	
   	@Override
   	protected void onStop() {
   		// Si hay una tarea corriendo en segundo plano, la paramos
   		if(tarea != null && tarea.getStatus().equals(AsyncTask.Status.FINISHED)) {
   			tarea.cancel(true);
   		}
   		super.onStop();
   	}
   	
   	@Override
   	public boolean onCreateOptionsMenu(Menu menu) {
   		MenuInflater inflater = getMenuInflater();
   		inflater.inflate(R.menu.menu_principal, menu);
   		return true;
   	}
   	
   	@Override
   	public boolean onOptionsItemSelected(MenuItem item) {
   		switch(item.getItemId()) {
   			case R.id.menuAcercaDe:
   				showDialog(DIALOG_ABOUT);
   				return true;
   			case R.id.menuSalir:
   				finish();
   				return true;
   			default:
   				return super.onOptionsItemSelected(item);
   		}
   	}
   	
   	@Override
   	protected Dialog onCreateDialog(int id) {
   		switch(id) {
   			case DIALOG_ABOUT:
   				AlertDialog dialogAbout = null;
   				final AlertDialog.Builder builder;
   				LayoutInflater li = LayoutInflater.from(this);
   				View view = li.inflate(R.layout.acerca_de, null);
   				builder = new AlertDialog.Builder(this).setIcon(R.drawable.icon);
   				builder.setTitle(getString(R.string.app_name));
   				builder.setPositiveButton("Ok", null);
   				builder.setView(view);
   				dialogAbout = builder.create();
   				return dialogAbout;
   			default:
   				return null;
   		}
   	}
   	
   	@Override
   	protected void onListItemClick(ListView l, View v, int position, long id) {
   		Intent intent = new Intent();
   		intent.setClass(TitularesActivity.this, NoticiaActivity.class);
   		intent.putExtra("idNoticia", id);
   		startActivity(intent);
   	}
   	
   	/**
   	 * @title: configurarAdapter
   	 * @desc: Este método obtendrá los datos de la BD mediante una consulta
   	 * 		  al proveedor de contenidos FeedsProvider, la cual devolverá
   	 * 		  un objeto de tipo Cursor.
   	 */
   	private void configurarAdapter() {
		// Obtenemos todos los artículos de la BD
   		final String[] columnas = new String[] { Posts._ID, Posts.TITLE, Posts.PUB_DATE, Posts.DESCRIPTION};
   		Uri uri = Uri.parse("content://es.masterd.blog/post");
   		Cursor cursor = managedQuery(uri, columnas, null, null, Posts.PUB_DATE + " DESC");
   		
   		// Comprobamos si  han cambiado los datos para recargar el cursor
   		cursor.setNotificationUri(getContentResolver(), uri);
   		
   		// Para que la actividad se encargue de manejar el cursor segun sus ciclos de vida
   		startManagingCursor(cursor);
   		
   		// Mapeamos las Querys SQL a los campos de las vistas
   		String[] camposDB = new String[] { Posts.TITLE, Posts.PUB_DATE, Posts.DESCRIPTION};
   		int[] camposView = new int[] { R.id.feedTitulo, R.id.feedFecha, R.id.feedContenido };
   		
   		// Creamos el adapter
   		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.feeds_item, cursor, camposDB, camposView);
   		
   		// La fecha se debe formatear
   		final java.text.DateFormat dateFormat = DateFormat.getLongDateFormat(TitularesActivity.this);
   		adapter.setViewBinder(new ViewBinder() {
			@Override
			public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
				if(view.getId() == R.id.feedFecha) {
					long timestamp = cursor.getLong(columnIndex);
					((TextView) view).setText(dateFormat.format(timestamp));
					return true;
				} else if (view.getId() == R.id.feedContenido) {
					String source = cursor.getString(columnIndex);
					int index = source.indexOf(".");
					String texto = source.substring(0, index) + "...";
					((TextView) view).setText(texto);
					return true;
				}
				return false; // Que se encargue el adapter
			}
   		});
   		
   		// Todo listo, cargamos el adapter
   		setListAdapter(adapter);
	}
   	
   	/**
   	 * @title: cargarNoticias
   	 * @desc: Comprobara las SharedPreferences y, si ha pasado el tiempo 
   	 *        necesario, ejecutará el proceso de cargarNoticias
   	 */
   	private void cargarNoticias() {
   		SharedPreferences prefs = getPreferences(MODE_PRIVATE);
   		long ultimaActualizacion = prefs.getLong("ultima_actualizacion", 0);
   		if((System.currentTimeMillis() - ultimaActualizacion) > FRECUENCIA_ACTUALIZACION) {
   			// Llamamos al AsyncTask para cargar el feed de noticias
   			tarea = new ActualizarPostAsyncTask();
   			tarea.execute(this);
   		}
   	}
   	
   	private void setBarraProgresoVisible(boolean visible) {
		final Window window = getWindow();
		if (visible) {
			window.setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);
			window.setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_INDETERMINATE_ON);
			
		} else {
			window.setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_OFF);
		}
	}
   	
   	class ActualizarPostAsyncTask extends AsyncTask<Context, Void, Void> {
   		
   		@Override
   		protected void onPreExecute() {
   			setBarraProgresoVisible(true);
   			super.onPreExecute();
   		}
   		
   		@Override
   		protected Void doInBackground(Context... params) {
   			Context context = params[0];
   			RssDownloadHelper.updateRssData(FEED_URL, context.getContentResolver());
   			
   			return null;
   		}
   		
   		@Override
   		protected void onPostExecute(Void result) {
   			// Guardamos en SharedPreferences el momento en que se terminó la actualización
   			SharedPreferences prefs = getPreferences(MODE_PRIVATE);
   			Editor editor = prefs.edit();
   			editor.putLong("ultima_actualizacion", System.currentTimeMillis());
   			editor.commit();
   			setBarraProgresoVisible(false);
   		}
   		
   		@Override
   		protected void onCancelled() {
   			setBarraProgresoVisible(false);
   			// Se ha cancelado la actualizacion, la proxima vez que se arranque debera volverse a cargar
   			SharedPreferences prefs = getPreferences(MODE_PRIVATE);
   			Editor editor = prefs.edit();
   			editor.putLong("ultima_actualizacion", 0);
   			editor.commit();
   			super.onCancelled();
   		}
   	}
}